package com.psychologyCommunity.Community.Contoller;

import com.psychologyCommunity.Community.entity.Comment;
import com.psychologyCommunity.Community.entity.DiscussPost;
import com.psychologyCommunity.Community.entity.Event;
import com.psychologyCommunity.Community.event.EventProducer;
import com.psychologyCommunity.Community.service.CommentService;
import com.psychologyCommunity.Community.service.DiscussPostService;
import com.psychologyCommunity.Community.util.CommunityConstance;
import com.psychologyCommunity.Community.util.HostHolder;
import com.psychologyCommunity.Community.util.RedisKeyUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Date;
import java.util.List;

@Controller
@RequestMapping("/comment")
public class CommentController implements CommunityConstance {

    @Autowired
    private HostHolder hostHolder;

    @Autowired
    private EventProducer eventProducer;
    @Autowired
    private CommentService commentService;

    @Autowired
    private DiscussPostService discussPostService;

    @Autowired
    private RedisTemplate redisTemplate;


    //关于回帖 的提交 ，提交路径肯定带了帖子的id
    //另外 提交的内容 ：除了评论的内容，还有评论给哪个类型，哪个id 这些也需要隐含传过来 -- entity_type, entity_id, target_id, content,
    // --因为传入多个数据，就直接声明一个实体comment 来接受这些数据
    @RequestMapping(path = "/add/{discussPostId}",method= RequestMethod.POST)
    public String addComment(@PathVariable("discussPostId") int discussPostId, Comment comment){
        //补充这个comment的内容时，要补充的数据 user_id, status, create_time
        // 其中增加一个评论 肯定是当前登录的用户来增加的 所以user_id 肯定 是当前的用户id
        comment.setUserId(hostHolder.getUser().getId());
        comment.setStatus(0);
        comment.setCreateTime(new Date());
        commentService.addComment(comment);

        //触发评论事件 因为之前event的各字段 set完之后返回的是 this (event)，所以可以直接连续set
       //事件触发的 人就是当前登录的 人hostHolder.getUser().getId()
        Event event=new Event()
                .setTopic(TOPIC_COMMENT)
                .setUserId(hostHolder.getUser().getId())
                .setEntityType(comment.getEntityType())
                .setEntityId(comment.getEntityId())
                .setData("postId",discussPostId);//消费事件所需要的data都放到postId这个key的值中，可能有的用不上
        //看评论的目标是帖子还是评论 ,这个评论的目标的作者
        if(comment.getEntityType() ==ENTITY_TYPE_COMMENT){
            DiscussPost discussPostById = discussPostService.findDiscussPostById(comment.getEntityId());
            event.setEntityUserId(discussPostById.getUserid());//设置 评论的目标的作者
        }else if(comment.getEntityType()==ENTITY_TYPE_POST){
            Comment commentById = commentService.findCommentById(comment.getEntityId());
            event.setEntityUserId(commentById.getUserId());
        }
        //到这 even已经构造完整了 此时去发布消息 处理消息
        eventProducer.fireEvent(event);
        //计算帖子的分数
        String postScoreKey = RedisKeyUtil.getPostScoreKey();
        //用Set而不用队列的原因：存在缓存中的数据 无需排序并且要去重--
        // 可能这个用户点赞由清除又点赞进行多次，那么重复数据算起来没有意义，
        redisTemplate.opsForSet().add(postScoreKey,discussPostId);//评论帖子时需要加分，放到缓存里

        ////触发发帖事件--如果评论的是帖子
        if(comment.getEntityType()==ENTITY_TYPE_POST){
            event=new Event()
                    .setTopic(TOPIC_PUBLISH)
                    .setUserId(comment.getUserId())
                    .setEntityType(ENTITY_TYPE_POST)
                    .setEntityId(discussPostId);
            eventProducer.fireEvent(event);

        }

        //添加完之后 重定向到 帖子详情页面
        return  "redirect:/discuss/detail/"+discussPostId;
    }

}
